package com.breeze.leetcode;

/**
 * https://leetcode-cn.com/problems/power-of-two/
 * 231. 2的幂
 * 给定一个整数，编写一个函数来判断它是否是 2 的幂次方。
 */
public class LeetCode231 {
    /**
     * 方法一： << 运算符
     */
    public boolean isPowerOfTwo(int n) {
        for (int i = 0; i < 32; i++) {
            int res = 1 << i;
            if (res == n) {
                return true;
            }
            if (res > n) {
                return false;
            }
        }
        return false;
    }

    /**
     * 方法二： 位运算 &
     *
     * 若 n = 2的x次幂，且 x 为自然数，则一定满足以下条件：
     * 1. n & (n-1) == 0 ，这是因为：
     *      1.1 n 二进制最高位为1,其余为都为0
     *      1.2 n-1 最高位为0,其余位为1
     * 2. n > 0
     */
    public boolean isPowerOfTwo1(int n) {
        return n > 0 && (n & n - 1) == 0;
    }

    public static void main(String[] args) {
        LeetCode231 leetCode231 = new LeetCode231();
        System.out.println(leetCode231.isPowerOfTwo(1));
        System.out.println(leetCode231.isPowerOfTwo1(1));
    }

}
